package design;

/**
 * 懒汉式单例模式:保证多线程下安心性，使用双重检查
 */
public class SingleDesign {

    private static volatile SingleDesign instance;//volatile关键字，防止指令重排，将创建的对象及时刷新到主存中

    public static SingleDesign getInstance() {
        if (instance == null) {//如果不为null说明已经创建完了，但是为null,两个线程同时进来
            synchronized (SingleDesign.class) {//其中一个现场获取锁，另一个现场阻塞
                if (instance == null) {//第二层判断，如果第一个现场创建对象并释放锁，第二个线程进来，再次判断，此时已经创建好对象了，对象不为空

                    instance = new SingleDesign();

                }
            }

        }
        return instance;
    }
}
